package com.ihrm.system.service;

import com.ihrm.common.controller.BaseController;
import com.ihrm.common.service.BaseService;
import com.ihrm.common.utils.IdWorker;
import com.ihrm.common.utils.PermissionConstants;
import com.ihrm.domain.system.Permission;
import com.ihrm.domain.system.Role;
import com.ihrm.system.dao.PermissionDao;
import com.ihrm.system.dao.RoleDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 角色操作业务逻辑层
 */
@Service
public class RoleService extends BaseService {
    @Autowired
    private IdWorker idWorker;
    
    @Autowired
    private RoleDao roleDao;
    
    @Autowired
    private PermissionDao permissionDao;
    
    /**
     * 分配权限
     */
    public void assignPerms(String roleId,List<String> permIds){
        /**
         * 获取分配的角色对象
         */
        Role role = roleDao.findById(roleId).get();
        /**
         * 构造角色的权限集合
         */
        Set<Permission> perms=new HashSet<>();
        for(String permId:permIds){
            Permission permission=permissionDao.findById(permId).get();
            /**
             * 需要根据父id和类型查询API权限列表
             */
            /**
             * todo:
             *  getId() or getPid()
             */
            List<Permission> apiList = permissionDao.findByTypeAndPid(PermissionConstants.PERMISSION_API, permission.getId());
            /**
             * 自定赋予API权限
             */
            perms.addAll(apiList);
            /**
             * 当前菜单或按钮的权限
             */
            perms.add(permission);
        }
        System.out.println(perms.size());
        /**
         * 设置角色和权限的关系
         */
        role.setPermissions(perms);
        /**
         * 更新角色
         */
        roleDao.save(role);
    }
    
    /**
     * 添加角色
     */
    public void save(Role role){
        role.setId(idWorker.nextId()+"");
        roleDao.save(role);
    }
    
    /**
     * 更新角色
     */
    public void update(Role role){
        Role target=roleDao.getOne(role.getId());
        target.setDescription(role.getDescription());
        target.setName(role.getName());
        roleDao.save(target);
    }
    
    /**
     * 根据id查询角色
     */
    public Role findById(String id){
        return roleDao.findById(id).get();
    }
    
    /**
     * 根据公司id查询公司下角色
     */
    public List<Role> findAll(String companyId){
        return roleDao.findAll(getSpec(companyId));
    }
    
    /**
     * 根据分页查询角色
     */
    public Page<Role> findByPage(String companyId, int page, int size){
        return roleDao.findAll(getSpec(companyId), PageRequest.of(page-1,size));
    }
    
    /**
     * 删除角色
     */
    public void delete(String id){
        roleDao.deleteById(id);
    }
}
